package testes;

import static org.junit.Assert.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;

import banco.*;

public class TesteCliente {

	@Test
	public void testLogin() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		assertEquals(opcoesGUICliente.login(novaConta.getNumero(), dadosSistema.clientes.get(1).getSenha(), dadosSistema), dadosSistema.clientes.get(1));
	}

	@Test
	public void testEfetuaPagamento() throws ParseException {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date today = new Date();
		String data = "25062013";
		
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, today);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, today);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 1000, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 5000, dadosSistema);

		assertTrue(opcoesGUICliente.efetuaPagamento(1, 1, 0, 1, data, 100, 10, dadosSistema));		
	}

	@SuppressWarnings("deprecation")
	@Test
	public void testPagamentoHistoricoOperacoes() throws ParseException {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date today = new Date();
		String data = "25062013";
				
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, today);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, today);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 1000, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 5000, dadosSistema);

		boolean pagamentoEfetuado = opcoesGUICliente.efetuaPagamento(1, 1, 0, 1, data, 100, 10, dadosSistema);
		
		for (int i = 0; i < novaConta1.operacoes.size(); i++) {
			Pagamento pagamento = novaConta1.operacoes.get(i).pagamento; 
			if (pagamento.getData().getDate() == today.getDate() && 
					pagamento.getData().getMonth() == today.getMonth() &&
					pagamento.getData().getYear() == today.getYear()){
				if (pagamento.getAgenciaOrigem() == 1 && pagamento.getAgenciaDestino() == 1){
					if (pagamento.getValor() == 100 && pagamento.getMulta() == 10){
						assertTrue(pagamentoEfetuado);
						return;
					}
				}
			}
		}

		fail();		
	}	
	
	@Test
	public void testFazDeposito() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, data);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 500, dadosSistema);

		assertTrue(opcoesGUICliente.fazDepositoComVerificacao(0, 1, 50, 1, dadosSistema));
	}	
	
	@SuppressWarnings("deprecation")
	@Test
	public void testDepositoListaVerificacao() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, data);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 500, dadosSistema);

		boolean depositoEfetuado = opcoesGUICliente.fazDepositoComVerificacao(0, 1, 50, 1, dadosSistema);
		
		for (int i = 0; i < dadosSistema.depositosAguardandoVerificacao.size(); i++) {
			Date dataPagamento = dadosSistema.depositosAguardandoVerificacao.get(i).getData();
			if (dataPagamento.getDate() == data.getDate() && 
					dataPagamento.getMonth() == data.getMonth() &&
					dataPagamento.getYear() == data.getYear()){
				if (dadosSistema.depositosAguardandoVerificacao.get(i).getAgenciaDestino() == 1){
					if (dadosSistema.depositosAguardandoVerificacao.get(i).getContaDestino() == 0){
						if (dadosSistema.depositosAguardandoVerificacao.get(i).getValor() == 50){
							if (!(dadosSistema.depositosAguardandoVerificacao.get(i).isSubmetido() &&
									dadosSistema.depositosAguardandoVerificacao.get(i).isVerificado())){
								if (dadosSistema.depositosAguardandoVerificacao.get(i).getEnvelope() == 1){
									assertTrue(depositoEfetuado);
									return;						
								}
							}
						}
					}
				}
			}
		}
		
		fail();
	}	

	@Test
	public void testFazSaque() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		assertTrue(opcoesGUICliente.fazSaque(1, 0, 50, dadosSistema));
	}

	@Test
	public void testFazTransferencia() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, data);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 500, dadosSistema);

		assertTrue(opcoesGUICliente.fazTransferencia(1, 1, 0, 1, 10, dadosSistema));
	}

	@Test
	public void testImprimeSaldo() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		
		opcoesGUIFunc.fazSaque(1, 0, 50, dadosSistema);

		assertTrue(opcoesGUICliente.imprimeSaldo(0, dadosSistema));
	}

	@Test
	public void testImprimeExtrato() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		assertTrue(opcoesGUICliente.imprimeExtrato(0, dadosSistema));
	}

	@Test
	public void testLogout() {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);

		assertEquals(opcoesGUICliente.logout(dadosSistema), dadosSistema.clientes.get(0));
	}

}
